package com.wangyf.thread.other;

/**
 * 查看new Object在字节码层面是如何做的
 * 1.run method main
 * 2.menu - view - show bytecode with jclass lib
 * 3. 2做之前需要安装插件 搜索 jclass 就能看到
 * @author wangyf
 * @date 2021/1/2 11:12
 * 运行结果:
 * 0 new #2 <java/lang/Object>                   -- 申请内存
 * 3 dup                                         -- 复制
 * 4 invokespecial #1 <java/lang/Object.<init>>  -- 调用Object的构造方法
 * 7 astore_1                                    -- 内存地址赋值给 o
 * 8 return
 *
 * 用人话来说就是:
 * 1.在堆中开辟一块内存。
 * 2.调用该类的构造方法实例化对象。
 * 3.返回堆内存的地址。
 *   一般情况下，我们会声明一个该类的引用，并将new返回的地址赋给引用。引用即可代表对象了，
 * 正常来说就是 1 2 3 ，但是jvm可能进行指令重排序，变成 1 3 2，也就是申请完内存 还没有初始化对象就把内存地址返回，
 * 如果这时候操作了这个对象，很有可能出问题，因为可能 对象中 对某个成员变量赋了初始值，但内存中还没有
 */
public class T02_jclass {
    public static void main(String[] args) {
        Object o = new Object();
        //Object o1 = new Object();

    }
}
